博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XSS AND CSRF
阅读量:7080 次
发布时间:2019-06-28

本文共 2507 字,大约阅读时间需要 8 分钟。

大家都知道XSS和CSRF是网站中常见的两种攻击形式

XSS

一、概念

XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

简单讲就是将你的页面中插入一些脚本,脚本中带攻击代码来攻击你的网站

二、常见的形式

xss类型(反射型、持久型、DOM-Based)

1、DOM-Based

不基于后端,DOM-Based 当用户更改了某个标签的属性 或往某个标签中塞入一些内容 (有可能是script标签) document.write

```    
DOM-Based
```复制代码
2、反射型

即客户端传给服务器什么,服务器就原封不动的返回来。

1)url中带XSS攻击

例如:我们用express在3000端口下起一个服务,当我们访问welcome的时候如果在当前的url中传入什么内容,页面上就展示什么内容。这时候我将url传入的内容改成一段脚本

http://localhost:3000/welcome?type=复制代码

chrome浏览器上会出现一个报错页面,chrome浏览器自身对于这种攻击性的代码做了拦截处理。内容如下:

该网页无法正常运作 Chrome 在此网页上检测到了异常代码。为保护您的个人信息(例如密码、电话号码和信用卡信息),Chrome 已将该网页拦截。 请尝试访问该网站的首页。 ERR_BLOCKED_BY_XSS_AUDITOR

safari 浏览器会拦截这个请求,并报出XSS提示

The XSS Auditor refused to execute a script in '' because its source code was found within the request. The auditor was enabled because the server did not send an 'X-XSS-Protection' header.

QQ浏览器和火狐浏览器上就会被攻击 弹出alert(1),这时候攻击者就可以做她们想做的事情了,比如获取用户的cookie等。

代码如下:

const express = require('express'); const app = express();  app.get('/welcome', function (req, res) {    res.send(`${req.query.type}`) });  app.listen(3000);复制代码
3、持久型

一个评论的输入框,输入评论内容后提交给服务器,并在页面展示该条评论。 如果这时候提交的是一段脚本的话,在页面显示时会遭到攻击。如果这些评论列表接口的数据是共享的话,那不管是哪个用户访问这个评论页面都会受到攻击,而且是持久的。

三、预防手段

DOM-Based: url 转义输入的内容 encodeURIComponent

$('.box').html(``)复制代码

总的来说预防手段就是编码

CSRF

一、概念

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

简单讲就是冒充或伪造用户身份去做一些事情(比如别人写了一个钓鱼网站,当你访问钓鱼网站的时候,它可以借走你的身份去干你想干的事)

二、常见的形式

用户A -> 访问正规的网站A -> 在网站A中产生cookie -> 在网站A用添加一些图片 文字等吸引用户的东西 来引导用户来访问钓鱼网站B -> 钓鱼网站B中内嵌iframe等 通过iframe镶嵌进来的页面 带着cookie向网站A发起请求 ->网站WebA接收到用户浏览器的请求,WebA无法分辨请求由何处发出,由于浏览器访问时带上用户的Cookie,因此WebA会响应浏览器的请求,如此一来,攻击网站WebB就达到了模拟用户操作的目的。

三、预防手段

防范csrf攻击(验证码、referer、token)

1、验证码

大部分网站添加验证码的主要作用是用来防止并发量的(例如:12306),可以起到一定的防御作用并屏蔽一些问题,但不是最优的解决方案。

2、referer(判断来源)

如果不是当前网站发来的请求,那非常可能是被其他网站攻击了。不靠谱,因为Referer只是一个请求头,可以用node自己发请求来改变它。

3、token

CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。 这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对。

不要厌烦熟悉的事物,每天都进步一点;不要畏惧陌生的事物,每天都学习一点;

转载地址:http://zdvml.baihongyu.com/

你可能感兴趣的文章
四个 服务器设计模型(42)
查看>>
libevent多线程使用事项
查看>>
linux jps 命令
查看>>
ThreadLocal是否会引发内存泄露的分析 good
查看>>
ios9新特性概述
查看>>
Android的BUG(一) - HTML 5 播放streaming video造成卡住的问题
查看>>
Vim文本编辑器 指令簿(二)
查看>>
linux命令后加一个 &
查看>>
支付标记化(Tokenization)技术
查看>>
centos7 安装kvm, 并创建虚拟机
查看>>
VC++实现在系统托盘来新消息闪烁,鼠标悬停显示窗口
查看>>
Kali命令集
查看>>
Leetcode: Battleships in a Board
查看>>
【死磕jeestie源码】类型后面三个点(String...)和数组(String[])的区别
查看>>
Eigen教程(10)
查看>>
ambari HDFS-HA 回滚
查看>>
Linux命令:用“dirs”、“pushd”、“popd”来操作目录栈
查看>>
HTTP basic 认证
查看>>
并非全部的程序猿都适合做技术管理
查看>>
MySQL数据类型-decimal详解
查看>>